package com.cari.oa.dao;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import javax.annotation.Resource;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

/**
 * BaseDao类
 * User: yexuhui
 * Date: 12-12-11
 * Time: 上午11:32
 */
@SuppressWarnings("unchecked")
public abstract class BaseDao<T extends Serializable> {

    protected Class<T> entityClass = null;

    @Resource
    private SessionFactory sessionFactory;

    public BaseDao() {
        entityClass = (Class<T>) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    /**
     * 获取当前hibernate session
     * @return hibernate session
     */
    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    /**
     * 插入一个实体
     * @param t 实体对象
     */
    public String insert(T t) {
        return (String)getSession().save(t);
    }

    /**
     * 更新一个实体
     * @param t 实体对象
     */
    public void update(T t) {
        getSession().update(t);
    }

    /**
     * 删除一个实体
     * @param t 实体对象
     */
    public void delete(T t) {
        getSession().delete(t);
    }

    /**
     * 根据ID删除实体
     * @param id 实体ID
     */
    public void deleteById(String id) {
        getSession().delete(getById(id));
    }

    /**
     * 根据ID获取实体
     * @param id 实体ID
     * @return 实体对象
     */
    public <E> T getById(String id) {
        return (T)getSession().get(entityClass, id);
    }

    /**
     * 获取全部实体对象
     * @return 全部实体对象
     */
    public <E> List<T> getAll() {
        String hql = "from " + entityClass.getName();
        Query query = getSession().createQuery(hql);
        return (List<T>)query.list();
    }

    /**
     * 根据hql分页查询实体对象
     * @param hql 带条件的查询语句，参数以？号标识
     * @param page 当前页
     * @param size 页条数
     * @param objs 参数列表
     * @return 分页实体对象
     */
    public <E> List<T> getPage(String hql, int page, int size, Object... objs) {
        Query query = getSession().createQuery(hql);
        for (int i = 0; i < objs.length; i++) {
            Object obj = objs[i];
            query.setParameter(i, obj);
        }
        query.setFirstResult((page-1)*size).setMaxResults(size);
        return (List<T>)query.list();
    }

    /**
     * 统计全部实体数
     * @return 总数
     */
    public Long getAllCount() {
        String hql = "select count(*) from " + entityClass.getName();
        Query query = getSession().createQuery(hql);
        return (Long)query.uniqueResult();
    }

    /**
     * 判断主键为该ID的对象是否存在
     * @param id 实体对象主键
     * @return 是否存在
     */
    public boolean existById(String id) {
        String hql = "select count(*) from " + entityClass.getName() + " where id = ?";
        Query query = getSession().createQuery(hql);
        query.setParameter(0, id);
        Long count = (Long)query.uniqueResult();
        return count > 0;
    }
}
